一、next数组(简单易懂)
next函数值仅取决于模式串本身,与主串无关
next数组的生成这里有两种方式:
1.前缀后缀匹配
2.字符串下标匹配
以一个数组为例:
a b a b a a a b a b a a
我们要生成这个模式串的next数组,那么首先第一件事就是为这些字符标号,
如下;
序号j: 1 2 3 4 5 6 7 8 9 10 11 12
模式串s: a b a b a a a b a b a a
方法一 前缀后缀匹配
- 前缀和后缀进行比较,如果前缀和后缀没有相同前缀,则为0+1,如果相同,则相同的字符个数+1;
- 前缀取s[n]之前字符的n-2位,后缀取s[n]之前n-1字符后面的后n-2位。
序号j: 1 2 3 4 5 6 7 8 9 10 11 12
模式串s: a b a b a a a b a b a a
next[]: 0 1
1.next[1],next[2]无论是什么模式串数组,永远都是0和1。
2.next[3]:如上,序号j[3]对应的模式串s[3],那么我们就看模式串s[3]前面的
字符即可,即为a b,那么s[3]的前缀为a,后缀为b,a和b不相同,则next[3]为0+1=1;
3.next[4]:序号j[4]对应的s[4],找s[4]的前面字符,为a b a,字符前缀为a、ab;
后缀为ba, a;有1个相同字符,则next[4]=1+1=2;
4.next[5]:序号j[5]对应的s[5],找